package com.doubao.user.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doubao.user.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 用户Mapper接口
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据ID查询用户
     *
     * @param userId 用户ID
     * @return 用户对象
     */
    User selectUserById(@Param("userId") Long userId);

    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户对象
     */
    User selectByUsername(@Param("username") String username);

    /**
     * 增加用户token使用量
     *
     * @param userId 用户ID
     * @param tokens token数量
     * @return 影响行数
     */
    int increaseTokensUsed(@Param("userId") Long userId, @Param("tokens") Long tokens);

    /**
     * 更新用户最后登录信息
     *
     * @param userId 用户ID
     * @param ip     登录IP
     * @return 影响行数
     */
    int updateLastLogin(@Param("userId") Long userId, @Param("ip") String ip);

    /**
     * 更新用户VIP状态
     *
     * @param userId    用户ID
     * @param vipStatus VIP状态
     * @return 影响行数
     */
    int updateVipStatus(@Param("userId") Long userId, @Param("vipStatus") Integer vipStatus);

    /**
     * 更新用户token余额
     *
     * @param userId           用户ID
     * @param totalTokensBalance token余额
     * @return 影响行数
     */
    int updateTokenBalance(@Param("userId") Long userId, @Param("totalTokensBalance") Integer totalTokensBalance);

    /**
     * 扣减用户token余额
     *
     * @param userId       用户ID
     * @param tokenAmount  扣减数量
     * @return 影响行数
     */
    int deductTokenBalance(@Param("userId") Long userId, @Param("tokenAmount") Integer tokenAmount);

    /**
     * 增加用户token余额
     *
     * @param userId      用户ID
     * @param tokenAmount 增加数量
     * @return 影响行数
     */
    int increaseTokenBalance(@Param("userId") Long userId, @Param("tokenAmount") Integer tokenAmount);

    /**
     * 同时更新用户token余额和已使用量
     *
     * @param userId 用户ID
     * @param tokensToDeduct 扣减数量
     * @return 影响行数
     */
    int updateTokensBalanceAndUsed(
            @Param("userId") Long userId,
            @Param("tokensToDeduct") Integer tokensToDeduct
    );
}